package com.atguigu.ssyx.acl.service.impl;

import com.atguigu.ssyx.acl.mapper.RoleMapper;
import com.atguigu.ssyx.acl.service.AdminRoleService;
import com.atguigu.ssyx.acl.service.RoleService;
import com.atguigu.ssyx.model.acl.AdminRole;
import com.atguigu.ssyx.model.acl.Role;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class RoleServiceImpl extends ServiceImpl<RoleMapper, Role> implements RoleService {

    private final AdminRoleService adminRoleService;


    @Override
    public Map<String, Object> findRoleByUserId(Long adminId) {
        //1.查询所有角色
        List<Role> allRolesList = baseMapper.selectList(null);
        //2.根据用户Id查询用户分配的角色列表
        //根据用户Id查询，在用户角色关系表中，查询用户分配的角色id列表

        LambdaQueryWrapper<AdminRole> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AdminRole::getAdminId, adminId);
        //2.1获取用户分配的角色列表
        List<AdminRole> adminRoleList = adminRoleService.list(wrapper);
        //2.2查询用户分配的角色id列表
        List<Long> roleIds = adminRoleList.stream().map(s -> s.getRoleId()).collect(Collectors.toList());

        //2.3对角色进行分类
        //创建一个集合，用来存放用户分配的角色列表
        ArrayList<Role> assignRoles = new ArrayList<>();

        //循环遍历所有角色，获取角色id看他们是不是在用户分配的角色id列表中
        for (Role role : allRolesList) {
            if (roleIds.contains(role.getId())) {
                //如果用户分配了角色，则添加到分配的角色列表中
                assignRoles.add(role);
            }
        }
        Map<String, Object> map = Map.of("allRolesList", allRolesList, "assignRoles", assignRoles);

        return map;


    }


    //优化版本 根据用户获取角色列表
    public Map<String, Object> findRoleByUserId2(Long adminId) {
        //1.查询所有角色
        List<Role> allRolesList = baseMapper.selectList(null);
        //2.用户表(adminId)与用户角色关系表联表查询，查询出已经分配角色的id集合
        List<Long> roleIdList = baseMapper.selectAdminRoleList(adminId);

        //3.创建一个集合，分配已分配的角色列表
        ArrayList<Role> assignRoles = new ArrayList<>();

        //4.遍历所有角色，拿到每一个角色id和已分配的角色Id集合进行对比
        for (Role role : allRolesList) {
//            拿到每一个角色id和已分配的角色Id集合进行对比
            if (roleIdList.contains(role.getId())) {
                //如果包含，则添加到分配的角色列表中
                assignRoles.add(role);
            }
        }
        //返回所有角色 和已分配的角色列表
        Map<String, Object> map = Map.of("allRolesList", allRolesList, "assignRoles", assignRoles);

        return map;
    }


    //根据用户分配角色
    @Override
    @Transactional(rollbackFor = Exception.class)
    public void saveBatchAdminRole(Long adminId, Long[] roleIds) {

        //1.根据用户id删除之前分配过的角色数据
        LambdaQueryWrapper<AdminRole> wrapper = new LambdaQueryWrapper<>();
        wrapper.eq(AdminRole::getAdminId, adminId);
        adminRoleService.remove(wrapper);
        //2.重新添加，把用户和角色关系数据添加到admin_role表中

        //创建集合，用来存放用户和角色关系数据
        List<AdminRole> adminRoleList = new ArrayList<>();
        //循环遍历角色id列表，创建用户和角色的关系数据
        for (Long roleId : roleIds) {
            AdminRole adminRole = new AdminRole();
            adminRole.setAdminId(adminId);
            adminRole.setRoleId(roleId);
            adminRoleList.add(adminRole);

        }

        //批量添加到数据库中
        adminRoleService.saveBatch(adminRoleList);


    }
}
